// compile: g++ -o forward forward.cc -std=c++11
// run: ./forward
#include <iostream>
using namespace std;

void func(int& t) { cout << "lvalue" << endl; }
void func(int&& t) { cout << "rvalue" << endl; }

template <typename T>
void Test(T&& t) {
  func(t);                   // func参数为左值
  func(std::forward<T>(t));  // func参数是左值还是右值依赖于T的类型
  func(std::move(t));        // func参数为右值
}
int main() {
  Test(1);  // lvalue rvalue rvalue
  int a = 1;
  Test(a);                       // lvalue lvalue rvalue
  Test(std::forward<int>(a));    // lvalue rvalue rvalue
  Test(std::forward<int&>(a));   // lvalue lvalue rvalue
  Test(std::forward<int&&>(a));  // lvalue rvalue rvalue
  return 0;
}
// std::forward<type>(target)，将target以type类型转发出去